/**
 * @file .
 * @author wangxiaowei0303@163.com
 */

#ifndef org_wxw0303_bishe_src_Filter_AdaptiveMFilter_h_
#define org_wxw0303_bishe_src_Filter_AdaptiveMFilter_h_

#include "Filter.h"

/* 
 * 自适应中值滤波器.
 * 考虑到该滤波器会自动扩充其邻域,所以在图像边界补充时,就不能只补充 
 * (row - 1) / 2,(col - 1) / 2.
 * 如 maxTimes == 2,意味着邻域最大可以扩展到 (row - 1) / 2 + maxTimes + 1,
 * (col - 1) / 2 + maxTimes + 1 这么大.所以需要重新实现 makeBorder().
 */
class AdaptiveMFilter: public Filter {
public:
    inline 
    AdaptiveMFilter();

    virtual void
    help(std::string &buf) const;

    virtual void
    set(const char *argname,const char *argval);

    virtual const char*
    get(const char *argname,std::string &buf) const;
    
    virtual void
    getSupportedArgs(std::vector<std::string> &arglist) const;

protected:    
    virtual double
    operOnNeigh(const cv::Mat &neighbor);

    virtual cv::Mat
    makeBorder(const cv::Mat &src,int &t,int &b,int &l,int &r);
protected:
    /*
     * 这里的 maxTimes 等于书中介绍的 Smax,如当 maxTimes 为 2,意味着在滤波期间,
     * 最多可以扩展 3 次邻域空间,但是在第 3 次扩展时,直接返回 Zmed.而不再想前
     * 2 次那样处理.
     */
    unsigned int maxTimes;
};

inline
AdaptiveMFilter::AdaptiveMFilter():
    Filter()
{
    maxTimes = 7;
}


#endif /* org_wxw0303_bishe_src_Filter_AdaptiveMFilter_h_ */

